#pragma GCC optimize(2)
#include <iostream>
#include <queue>
#include <map>
#include <unordered_map>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <cstring>
#include <set>
#include <unordered_set>
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const int N=3010;
int a[N];
int e[N],ne[N],w[N],h[N],idx;
int f[N][N];
int du[N];
int n,m;
void add(int a,int b,int c)
{
	e[idx]=b;
	w[idx]=c;
	ne[idx]=h[a];
	h[a]=idx++;
}
void dfs(int u)
{
	f[u][0]=0;
	for(int i=h[u];~i;i=ne[i])
	{
		int t=e[i];
		dfs(t);
		if(t>=n-m+1) du[t]++;
		du[u]+=du[t];	
	}
	
	for(int i=h[u];~i;i=ne[i])
	{
		int t=e[i];
		for(int j=du[u];j>=0;j--)
		{
			for(int k=0;k<=du[t] && k<=j;k++)
			{
				f[u][j]=max(f[u][j],f[u][j-k]+f[t][k]-w[i]);
			}
		}
	}
	
	if(u>=n-m+1) f[u][1]=a[u];
}

int main()
{
	memset(f,-0x3f,sizeof(f));
	memset(h,-1,sizeof(h));
	cin>>n>>m;
	for(int i=1;i<=n-m;i++)
	{
		int k;
		cin>>k;
		for(int j=1;j<=k;j++)
		{
			int b,c;
			cin>>b>>c;
			add(i,b,c);
		}
	}
	for(int i=n-m+1;i<=n;i++) cin>>a[i];
	
	dfs(1);
	
	int ans=0;
	for(int j=1;j<=du[1];j++)
	{
		if(f[1][j]>=0) ans=j;
	}
	cout<<ans;

	return 0;
}

